set(PXR_PREFIX pxr/base)
set(PXR_PACKAGE plug)

pxr_library(plug
    LIBRARIES
        arch
        tf
        js
        trace
        work
        ${Boost_PYTHON_LIBRARY}
        ${TBB_tbb_LIBRARY}

    INCLUDE_DIRS
        ${Boost_INCLUDE_DIRS}
        ${TBB_INCLUDE_DIRS}

    PUBLIC_CLASSES
        interfaceFactory
        notice
        plugin
        registry
        staticInterface

    PRIVATE_CLASSES
        debugCodes
        info
        testPlugBase

    PUBLIC_HEADERS
        api.h
        thisPlugin.h

    CPPFILES
        initConfig.cpp

    PYTHON_CPPFILES
        moduleDeps.cpp

    PYMODULE_CPPFILES
        module.cpp
        wrapNotice.cpp
        wrapPlugin.cpp
        wrapRegistry.cpp
        wrapTestPlugBase.cpp

    PYMODULE_FILES
        __init__.py
)

pxr_test_scripts(
    testPlug.py
)

pxr_build_test_shared_lib(TestPlugDso1
    CREATE_FRAMEWORK
    INSTALL_PREFIX PlugPlugins
    LIBRARIES
        tf
    CPPFILES
        testenv/TestPlugDso1.cpp
) 
pxr_build_test_shared_lib(TestPlugDso2
    INSTALL_PREFIX PlugPlugins
    LIBRARIES
        tf
    CPPFILES
        testenv/TestPlugDso2.cpp
) 
pxr_build_test_shared_lib(TestPlugDso3
    INSTALL_PREFIX PlugPlugins
    LIBRARIES
        tf
    CPPFILES
        testenv/TestPlugDso3.cpp
) 
pxr_build_test_shared_lib(TestPlugDsoEmpty
    INSTALL_PREFIX PlugPlugins
    LIBRARIES
        tf
    CPPFILES
        testenv/TestPlugDsoEmpty.cpp
) 
pxr_build_test_shared_lib(TestPlugDsoIncomplete
    INSTALL_PREFIX PlugPlugins
    LIBRARIES
        tf
    CPPFILES
        testenv/TestPlugDsoIncomplete.cpp
) 
pxr_build_test_shared_lib(TestPlugDsoUnloadable
    INSTALL_PREFIX PlugPlugins
    LIBRARIES
        tf
    CPPFILES
        testenv/TestPlugDsoUnloadable.cpp
) 
# This library helps test behavior when a plugin is unloadable,
# but some linkers by default will error out when building this due
# to the references to undefined symbols. So we need to specify a
# link flag to force these symbols to be looked up at runtime.
if (TARGET TestPlugDsoUnloadable)
    if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
        set_target_properties(TestPlugDsoUnloadable
            PROPERTIES
            LINK_FLAGS "-undefined dynamic_lookup"
        )
    elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
        # This forces the link to complete but the linker will still
        # report the missing symbol as an error and will also emit a
        # warning that the link was forced.  This is unfortunate as
        # it causes confusion.  There doesn't appear to be any way to
        # suppress either the warning or the error, though.  Rest
        # assured that the unresolved external symbol error is okay
        # for this target.
        set_target_properties(TestPlugDsoUnloadable
            PROPERTIES
            LINK_FLAGS "/FORCE:UNRESOLVED"
        )
    endif()
endif()

pxr_create_test_module(TestPlugModule1
    INSTALL_PREFIX PlugPlugins
)
pxr_create_test_module(TestPlugModule2
    INSTALL_PREFIX PlugPlugins
)
pxr_create_test_module(TestPlugModule3
    INSTALL_PREFIX PlugPlugins
)
pxr_create_test_module(TestPlugModuleEmpty
    INSTALL_PREFIX PlugPlugins
)
pxr_create_test_module(TestPlugModuleLoaded
    INSTALL_PREFIX PlugPlugins
)
pxr_create_test_module(TestPlugModuleLoadedBadBase
    INSTALL_PREFIX PlugPlugins
)
pxr_create_test_module(TestPlugModuleUnloadable
    INSTALL_PREFIX PlugPlugins
)
pxr_create_test_module(TestPlugModuleUnloadable2
    INSTALL_PREFIX PlugPlugins
)
pxr_create_test_module(TestPlugModuleDepBadBase
    INSTALL_PREFIX PlugPlugins
)
pxr_create_test_module(TestPlugModuleDepBadDep
    INSTALL_PREFIX PlugPlugins
)
pxr_create_test_module(TestPlugModuleDepBadDep2
    INSTALL_PREFIX PlugPlugins
)
pxr_create_test_module(TestPlugModuleDepBadLoad
    INSTALL_PREFIX PlugPlugins
)
pxr_create_test_module(TestPlugModuleDepCycle
    INSTALL_PREFIX PlugPlugins
)
pxr_create_test_module(TestPlugModuleIncomplete
    INSTALL_PREFIX PlugPlugins
)

pxr_register_test(testPlug
    PYTHON
    COMMAND "${CMAKE_INSTALL_PREFIX}/tests/testPlug"
)

